package br.com.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import br.com.beans.Especialidade;
import br.com.beans.Medico;
import br.com.beans.Usuario;

/**
 * Classe de manipulacao de objetos persistidos via JPA
 * Objetos da classe bean Medico
 */
public class MedicoDAO extends GenericDAO<Medico> {

	/**
	 * Exclui um Medico persistido
	 * @param userName UserName do Medico
	 * @return True se bem sucedido, false se houve erro.
	 */
	public boolean excluir(String userName) {

		EntityManager em = factory.createEntityManager();
		EntityTransaction t = em.getTransaction();
		Medico medico = null;
		Query q = null;
		boolean result = false;

		try {
			t.begin();
			
			q = em.createQuery("from Medico where userName = :userName");
			q.setParameter("userName", userName);
			medico = (Medico) q.getSingleResult();

			medico.getEspecialidade().getMedicos().remove(medico);
			medico = em.merge(medico);

			em.remove(medico);

			t.commit();
			
			result = true;

		} catch (Exception e) {

			if (debugInfo) {
				e.printStackTrace();
			}
			if (t.isActive()) t.rollback();

		} finally {

			em.close();
		}
		
		return result;
	}

	/**
	 * Localiza um medico persistido pelo UserName
	 * @param userName UserName do medico
	 * @return Objeto persistido
	 */
	public Medico localizar(String userName) {

		EntityManager em = factory.createEntityManager();
		EntityTransaction t = em.getTransaction();
		Medico obj = null;

		try {

			t.begin();
			Query query = em.createQuery("from Medico where userName like :userName");
			query.setParameter("userName", userName);
			obj = (Medico) query.getSingleResult();
			t.commit();

		} catch (Exception e) {

			if (debugInfo) {
				e.printStackTrace();
			}
			if (t.isActive()) t.rollback();

		} finally {

			em.close();
		}

		return obj;
	}

	/**
	 * Localiza um medico persistido pelo Nome
	 * @param nome Nome do medico
	 * @return Objeto persistido
	 */
	public Medico localizarPorNome(String nome) {

		EntityManager em = factory.createEntityManager();
		EntityTransaction t = em.getTransaction();
		Medico obj = null;
		Usuario usuario = null;
		Query query = null;
		
		try {

			t.begin();

			query = em.createQuery("from Usuario where nome like :nome");
			query.setParameter("nome", nome);
			usuario = (Usuario) query.getSingleResult();

			query = em.createQuery("from Medico where userName like :userName");
			query.setParameter("userName", usuario.getUserName());
			obj = (Medico) query.getSingleResult();
			
			t.commit();

		} catch (Exception e) {

			if (debugInfo) {
				e.printStackTrace();
			}
			if (t.isActive()) t.rollback();

		} finally {

			em.close();
		}

		return obj;
	}
	
	/**
	 * Lista medicos por especialidade
	 * @param especialidade Especialidade do medico
	 * @return Lista de objetos persistidos
	 */
	@SuppressWarnings("unchecked")
	public List<Medico> listarPorEspecialidade(Especialidade especialidade) {

		EntityManager em = factory.createEntityManager();
		EntityTransaction t = em.getTransaction();
		List<Medico> list = null;

		try {

			t.begin();
			Query q = em.createQuery("from Medico where especialidade = :especialidade");
			q.setParameter("especialidade", especialidade);
			list = (List<Medico>) q.getResultList();
			t.commit();

		} catch (Exception e) {

			if (debugInfo) {
				e.printStackTrace();
			}
			if (t.isActive()) t.rollback();

		} finally {

			em.close();
		}

		return list;
	}

}
